﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace Wheels
{
    public static class ObjectExtensions
    {
        private static Lazy<BinaryFormatter> smBinaryFormatter = new Lazy<BinaryFormatter>();

        /// <summary>
        /// 比较两个对象是否一致，使用这个扩展方法可以免去拆箱的麻烦。
        /// </summary>
        public static bool Is(this object @this, object that)
        {
            return object.Equals(@this, that);
        }
        /// <summary>
        /// 比较两个对象是否一致，使用这个扩展方法可以免去拆箱的麻烦。
        /// </summary>
        public static bool IsNot(this object @this, object that)
        {
            return !object.Equals(@this, that);
        }

        public static T Chain<T>(this T @this, Action<T> action)
        {
            action(@this);
            return @this;
        }
        public static TEnumerable ChainForEach<TEnumerable, TItem>(this TEnumerable @this, Action<TItem> action)
            where TEnumerable : IEnumerable<TItem>
        {
            foreach (var item in @this)
                action(item);
            return @this;
        }

        /// <summary>
        /// 深度复制对象。注意深度复制只适用于可序列化的对象。
        /// </summary>
        public static T DeepCopy<T>(this T @this)
        {
            var formatter = smBinaryFormatter.Value;
            using (var holder = new MemoryStream())
            {
                formatter.Serialize(holder, @this);
                holder.Position = 0;
                return (T)formatter.Deserialize(holder);
            }
        }
    }
}
